<!DOCTYPE html>



  


<html class="theme-next pisces use-motion" lang="zh-Hans">
<head><meta name="generator" content="Hexo 3.8.0">
  <meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<meta name="theme-color" content="#222">









<meta http-equiv="Cache-Control" content="no-transform">
<meta http-equiv="Cache-Control" content="no-siteapp">
















  
  
  <link href="/lideboke/lib/fancybox/source/jquery.fancybox.css?v=2.1.5" rel="stylesheet" type="text/css">







<link href="/lideboke/lib/font-awesome/css/font-awesome.min.css?v=4.6.2" rel="stylesheet" type="text/css">

<link href="/lideboke/css/main.css?v=5.1.4" rel="stylesheet" type="text/css">


  <link rel="apple-touch-icon" sizes="180x180" href="/lideboke/images/apple-touch-icon-next.png?v=5.1.4">


  <link rel="icon" type="image/png" sizes="32x32" href="/lideboke/images/favicon-32x32-next.png?v=5.1.4">


  <link rel="icon" type="image/png" sizes="16x16" href="/lideboke/images/favicon-16x16-next.png?v=5.1.4">


  <link rel="mask-icon" href="/lideboke/images/logo.svg?v=5.1.4" color="#222">





  <meta name="keywords" content="Hexo, NexT">










<meta property="og:type" content="website">
<meta property="og:title" content="Hexo">
<meta property="og:url" content="http://lidongaiwangbaoxia.gitee.io/lideboke/index.html">
<meta property="og:site_name" content="Hexo">
<meta property="og:locale" content="zh-Hans">
<meta name="twitter:card" content="summary">
<meta name="twitter:title" content="Hexo">



<script type="text/javascript" id="hexo.configurations">
  var NexT = window.NexT || {};
  var CONFIG = {
    root: '/lideboke/',
    scheme: 'Pisces',
    version: '5.1.4',
    sidebar: {"position":"left","display":"post","offset":12,"b2t":false,"scrollpercent":false,"onmobile":false},
    fancybox: true,
    tabs: true,
    motion: {"enable":true,"async":false,"transition":{"post_block":"fadeIn","post_header":"slideDownIn","post_body":"slideDownIn","coll_header":"slideLeftIn","sidebar":"slideUpIn"}},
    duoshuo: {
      userId: '0',
      author: '博主'
    },
    algolia: {
      applicationID: '',
      apiKey: '',
      indexName: '',
      hits: {"per_page":10},
      labels: {"input_placeholder":"Search for Posts","hits_empty":"We didn't find any results for the search: ${query}","hits_stats":"${hits} results found in ${time} ms"}
    }
  };
</script>



  <link rel="canonical" href="http://lidongaiwangbaoxia.gitee.io/lideboke/">





  <title>Hexo</title>
  








</head>

<body itemscope itemtype="http://schema.org/WebPage" lang="zh-Hans">

  
  
    
  

  <div class="container sidebar-position-left 
  page-home">
    <div class="headband"></div>

    <header id="header" class="header" itemscope itemtype="http://schema.org/WPHeader">
      <div class="header-inner"><div class="site-brand-wrapper">
  <div class="site-meta ">
    

    <div class="custom-logo-site-title">
      <a href="/lideboke/" class="brand" rel="start">
        <span class="logo-line-before"><i></i></span>
        <span class="site-title">Hexo</span>
        <span class="logo-line-after"><i></i></span>
      </a>
    </div>
      
        <p class="site-subtitle"></p>
      
  </div>

  <div class="site-nav-toggle">
    <button>
      <span class="btn-bar"></span>
      <span class="btn-bar"></span>
      <span class="btn-bar"></span>
    </button>
  </div>
</div>

<nav class="site-nav">
  

  
    <ul id="menu" class="menu">
      
        
        <li class="menu-item menu-item-home">
          <a href="/lideboke/" rel="section">
            
              <i class="menu-item-icon fa fa-fw fa-home"></i> <br>
            
            首页
          </a>
        </li>
      
        
        <li class="menu-item menu-item-tags">
          <a href="/lideboke/tags/" rel="section">
            
              <i class="menu-item-icon fa fa-fw fa-tags"></i> <br>
            
            标签
          </a>
        </li>
      
        
        <li class="menu-item menu-item-archives">
          <a href="/lideboke/archives/" rel="section">
            
              <i class="menu-item-icon fa fa-fw fa-archive"></i> <br>
            
            归档
          </a>
        </li>
      

      
    </ul>
  

  
</nav>



 </div>
    </header>

    <main id="main" class="main">
      <div class="main-inner">
        <div class="content-wrap">
          <div id="content" class="content">
            
  <section id="posts" class="posts-expand">
    
      

  

  
  
  

  <article class="post post-type-normal" itemscope itemtype="http://schema.org/Article">
  
  
  
  <div class="post-block">
    <link itemprop="mainEntityOfPage" href="http://lidongaiwangbaoxia.gitee.io/lideboke/lideboke/2019/03/24/lid-vue/">

    <span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
      <meta itemprop="name" content="lid">
      <meta itemprop="description" content>
      <meta itemprop="image" content="/lideboke/uploads/liangzhicai.jpg">
    </span>

    <span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
      <meta itemprop="name" content="Hexo">
    </span>

    
      <header class="post-header">

        
        
          <h1 class="post-title" itemprop="name headline">
                
                <a class="post-title-link" href="/lideboke/2019/03/24/lid-vue/" itemprop="url">MUI 与 Mint-UI 区别</a></h1>
        

        <div class="post-meta">
          <span class="post-time">
            
              <span class="post-meta-item-icon">
                <i class="fa fa-calendar-o"></i>
              </span>
              
                <span class="post-meta-item-text">发表于</span>
              
              <time title="创建于" itemprop="dateCreated datePublished" datetime="2019-03-24T09:58:00+08:00">
                2019-03-24
              </time>
            

            

            
          </span>

          
            <span class="post-category">
            
              <span class="post-meta-divider">|</span>
            
              <span class="post-meta-item-icon">
                <i class="fa fa-folder-o"></i>
              </span>
              
                <span class="post-meta-item-text">分类于</span>
              
              
                <span itemprop="about" itemscope itemtype="http://schema.org/Thing">
                  <a href="/lideboke/categories/vue/" itemprop="url" rel="index">
                    <span itemprop="name">vue</span>
                  </a>
                </span>

                
                
              
            </span>
          

          
            
          

          
          

          

          

          

        </div>
      </header>
    

    
    
    
    <div class="post-body" itemprop="articleBody">

      
      

      
        
          
            <h2 id="MUI-与-Mint-UI-区别"><a href="#MUI-与-Mint-UI-区别" class="headerlink" title="MUI 与 Mint-UI 区别"></a>MUI 与 Mint-UI 区别</h2><p>注意：</p>
<ul>
<li>MUI 不同于 Mint-UI，MUI只是开发出来的一套好用的代码片段，里面提供了配套的样式、配套的HTML代码段，类似于 Bootstrap；</li>
<li>而 Mint-UI，是真正的组件库，是使用 Vue 技术封装出来的 成套的组件，可以无缝的和 VUE项目进行集成开发；</li>
<li>因此，从体验上来说， Mint-UI体验更好，因为这是别人帮我们开发好的现成的Vue组件；</li>
<li>从体验上来说， MUI和Bootstrap类似；</li>
<li>理论上，任何项目都可以使用 MUI 或 Bootstrap，但是，MInt-UI只适用于Vue项目；</li>
</ul>

          
        
      
    </div>
    
    
    

    

    

    

    <footer class="post-footer">
      

      

      

      
      
        <div class="post-eof"></div>
      
    </footer>
  </div>
  
  
  
  </article>


    
      

  

  
  
  

  <article class="post post-type-normal" itemscope itemtype="http://schema.org/Article">
  
  
  
  <div class="post-block">
    <link itemprop="mainEntityOfPage" href="http://lidongaiwangbaoxia.gitee.io/lideboke/lideboke/2019/03/24/duoxiancheng/">

    <span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
      <meta itemprop="name" content="lid">
      <meta itemprop="description" content>
      <meta itemprop="image" content="/lideboke/uploads/liangzhicai.jpg">
    </span>

    <span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
      <meta itemprop="name" content="Hexo">
    </span>

    
      <header class="post-header">

        
        
          <h1 class="post-title" itemprop="name headline">
                
                <a class="post-title-link" href="/lideboke/2019/03/24/duoxiancheng/" itemprop="url">多线程学习</a></h1>
        

        <div class="post-meta">
          <span class="post-time">
            
              <span class="post-meta-item-icon">
                <i class="fa fa-calendar-o"></i>
              </span>
              
                <span class="post-meta-item-text">发表于</span>
              
              <time title="创建于" itemprop="dateCreated datePublished" datetime="2019-03-24T09:58:00+08:00">
                2019-03-24
              </time>
            

            

            
          </span>

          
            <span class="post-category">
            
              <span class="post-meta-divider">|</span>
            
              <span class="post-meta-item-icon">
                <i class="fa fa-folder-o"></i>
              </span>
              
                <span class="post-meta-item-text">分类于</span>
              
              
                <span itemprop="about" itemscope itemtype="http://schema.org/Thing">
                  <a href="/lideboke/categories/多线程/" itemprop="url" rel="index">
                    <span itemprop="name">多线程</span>
                  </a>
                </span>

                
                
              
            </span>
          

          
            
          

          
          

          

          

          

        </div>
      </header>
    

    
    
    
    <div class="post-body" itemprop="articleBody">

      
      

      
        
          
            <h2 id="新的线程Thread-独立的执行空间stack"><a href="#新的线程Thread-独立的执行空间stack" class="headerlink" title="新的线程Thread + 独立的执行空间stack"></a>新的线程Thread + 独立的执行空间stack</h2><p>java虚拟机会在线程与原来的主线程切换到两者都完成为止。</p>
<p>工人完成工作</p>
<h3 id="1-创建Runnable对象【工作】-接口方法为run-—就是会被线程执行的方法。"><a href="#1-创建Runnable对象【工作】-接口方法为run-—就是会被线程执行的方法。" class="headerlink" title="1.创建Runnable对象【工作】 接口方法为run()—就是会被线程执行的方法。"></a>1.创建Runnable对象【工作】 接口方法为run()—就是会被线程执行的方法。</h3><ul>
<li>Runnable对象—【工作】</li>
<li>实现Runnable接口建立给Thread运行的任务。</li>
</ul>
<h3 id="2-创建Thread对象【工人】-每个Thread需要一个任务来执行，一个可以放在执行空间的任务。"><a href="#2-创建Thread对象【工人】-每个Thread需要一个任务来执行，一个可以放在执行空间的任务。" class="headerlink" title="2.创建Thread对象【工人】    每个Thread需要一个任务来执行，一个可以放在执行空间的任务。"></a>2.创建Thread对象【工人】    每个Thread需要一个任务来执行，一个可以放在执行空间的任务。</h3><ul>
<li>Thread对象—【工人】</li>
<li>实现Runnable接口建立给Thread运行的任务。</li>
<li>调用start()，启动线程。在此之前，它只是个Thread的实例，并不是真正的线程。<h3 id="3-线程的状态："><a href="#3-线程的状态：" class="headerlink" title="3.线程的状态："></a>3.线程的状态：</h3>调度器：调度器来控制哪些线程被调用或者关起来，或者等待。<br>调度器不被控制，没有api。</li>
<li>新建    new Thread</li>
<li>可执行  start  等待被执行</li>
<li>执行中  轮到线程执行就变为执行中   </li>
<li>堵塞    一旦线程进入可执行状态，他会在可执行与执行中两种状态中来来去去，同时有一种状态：暂时不可执行（堵塞状态）</li>
<li>比如：线程调用某个被锁住的对象的方法，或者被睡眠，这种情况下，该线程堵塞，相当于关了小黑屋。 <h3 id="4-线程的先来后到"><a href="#4-线程的先来后到" class="headerlink" title="4.线程的先来后到"></a>4.线程的先来后到</h3></li>
</ul>
<p>某餐厅的卫生间很小，几乎只能容纳一个人如厕。为了保证不受干扰，如厕的人进入卫生间，就要锁上房门。我们可以把卫生间想 象成是共享的资源，而众多需要如厕的人可以被视作多个线程。假如卫生间当前有人占用，那么其他人必须等待，直到这个人如厕完毕，打开房门走出来为止。这就 好比多个线程共享一个资源的时候，是一定要分出先来后到的。</p>
<p>一个线程，一旦进入某一过程，必须等待正常的返回，并退出这一过程， 下一个线程才能开始这个过程。这里，最关键的就是卫生间的门。其实，卫生间的门担任的是资源锁的角色，只要如厕的人锁上门，就相当于获得了这个锁，而当他 打开锁出来以后，就相当于释放了这个锁。</p>
<h3 id="5-线程数据在内存中"><a href="#5-线程数据在内存中" class="headerlink" title="5.线程数据在内存中"></a>5.线程数据在内存中</h3><p>在Java程序运行时环境中，JVM需要对两类线程共享的数据进行协调：</p>
<p>1）保存在堆中的实例变量<br>2）保存在方法区中的类变量</p>
<p>这两类数据是被所有线程共享的。<br>（程序不需要协调保存在Java 栈当中的数据。因为这些数据是属于拥有该栈的线程所私有的。）</p>
<p>在java虚拟机中，每个对象和类在逻辑上都是和一个监视器相关联的。<br>对于对象来说，相关联的监视器保护对象的实例变量。<br>对于类来说，监视器保护类的类变量。<br>（如果一个对象没有实例变量，或者一个类没有变量，相关联的监视器就什么也不监视。）<br>为了实现监视器的排他性监视能力，java虚拟机为每一个对象和类都关联一个锁。代表任何时候只允许一个线程拥有的特权。线程访问实例变量或者类变量不需锁。</p>
<p>但是如果线程获取了锁，那么在它释放这个锁之前，就没有其他线程可以获取同样数据的锁了。（锁住一个对象就是获取对象相关联的监视器）</p>
<p>类锁实际上用对象锁来实现。当虚拟机装载一个class文件的时候，它就会创建一个java.lang.Class类的实例。当锁住一个对象的时候，实际上锁住的是那个类的Class对象。</p>
<p>一个线程可以多次对同一个对象上锁。对于每一个对象，java虚拟机维护一个加锁计数器，线程每获得一次该对象，计数器就加1，每释放一次，计数器就减 1，当计数器值为0时，锁就被完全释放了。</p>
<p>java编程人员不需要自己动手加锁，对象锁是java虚拟机内部使用的。在java程序中，只需要使用synchronized块或者synchronized方法就可以标志一个监视区域。当每次进入一个监视区域时，java 虚拟机都会自动锁上对象或者类。</p>
<h3 id="3-多线程的缺点：并发性问题"><a href="#3-多线程的缺点：并发性问题" class="headerlink" title="3.多线程的缺点：并发性问题"></a>3.多线程的缺点：并发性问题</h3><h4 id="3-1线程的世界观："><a href="#3-1线程的世界观：" class="headerlink" title="3.1线程的世界观："></a>3.1线程的世界观：</h4><ul>
<li>线程的世界观：线程随时有可能昏迷，进而停止自己的运行，并在之后继续运行【停止期间的世界中所有的变化认为没有】</li>
<li>这种强烈的以自我为中心得世界观，造就了并发的问题。</li>
<li>wait()和notify()都是Object的方法。</li>
<li>wait()-等待：如果线程发现这个资源还没有准备好，它就可以在这个资源上进行等待。</li>
<li>notify()-唤醒：如果有另外的线程经过某些处理觉得这个资源可用了，会调用这个这个资源的notify()方法，告诉等待它的线程，这个资源可以用了。</li>
</ul>
<h4 id="3-1-0-众所周知，在Java多线程编程中，一个非常重要的方面就是线程的同步问题。"><a href="#3-1-0-众所周知，在Java多线程编程中，一个非常重要的方面就是线程的同步问题。" class="headerlink" title="3.1.0 众所周知，在Java多线程编程中，一个非常重要的方面就是线程的同步问题。"></a>3.1.0 众所周知，在Java多线程编程中，一个非常重要的方面就是线程的同步问题。</h4><p>关于线程的同步，一般有以下解决方法：</p>
<ol>
<li>在需要同步的方法的方法签名中加入synchronized关键字。</li>
<li>使用synchronized块对需要进行同步的代码段进行同步。</li>
<li>使用JDK 5中提供的java.util.concurrent.lock包中的Lock对象。</li>
</ol>
<p>另外，为了解决多个线程对同一变量进行访问时可能发生的安全性问题，我们不仅可以采用同步机制，更可以通过JDK 1.2中加入的ThreadLocal来保证更好的并发性。</p>
<h5 id="3-1-1-读取差错-【读丢失】-—-【synchronized】作用方法"><a href="#3-1-1-读取差错-【读丢失】-—-【synchronized】作用方法" class="headerlink" title="3.1.1 读取差错 【读丢失】  —   【synchronized】作用方法"></a>3.1.1 读取差错 【读丢失】  —   【synchronized】作用方法</h5><ul>
<li>线程如果想正常运行， 最起码必须保证自己的世界不被打扰。</li>
<li>自己的世界=【自己独立的空间】+【公共的空间+锁机制（钥匙）】。</li>
<li>锁【synchronized】不是作用在方法上，而是作用在对象上。</li>
<li>每个对象都有锁，大部分时间没有被锁上。当对象有一个或多个同步化方法时，线程需要取得对象锁的钥匙时才能进入同步化的方法。</li>
<li>锁锁住的是对象，不是对象的方法，锁住的是数据，而不是存取数据的方法。</li>
</ul>
<h5 id="3-1-2-丢失更新-【写丢失】-—-【synchronized】作用对象"><a href="#3-1-2-丢失更新-【写丢失】-—-【synchronized】作用对象" class="headerlink" title="3.1.2 丢失更新 【写丢失】  —   【synchronized】作用对象"></a>3.1.2 丢失更新 【写丢失】  —   【synchronized】作用对象</h5><ul>
<li>同时操作变量，A线程操作变量多次后，B线程在操作相同变量造成回退。</li>
<li>synchronized(this){ func1(),func2()}                 </li>
</ul>
<h5 id="3-1-3-死锁问题"><a href="#3-1-3-死锁问题" class="headerlink" title="3.1.3 死锁问题"></a>3.1.3 死锁问题</h5><ul>
<li>最严重，AB线程各自持有对方需要的对象的钥匙。一直等待。</li>
<li>synchronized是java内置的关键字，synchronized的获取和释放锁由JVM实现，用户不需要显示的释放锁。但也死锁。               <h5 id="3-1-4-效率"><a href="#3-1-4-效率" class="headerlink" title="3.1.4 效率"></a>3.1.4 效率</h5></li>
<li>synchronized会带来    庞大的性能成本，故一般不会轻易在方法上声明。而应该在需要保护的代码块上添加synchronized。<h5 id="3-1-5-synchronized不方便"><a href="#3-1-5-synchronized不方便" class="headerlink" title="3.1.5 synchronized不方便"></a>3.1.5 synchronized不方便</h5></li>
<li>1.只有一个”条件”与锁相关联，这对于大量并发线程的情况是很难管理(等待和唤醒</li>
<li>2.多线程竞争一个锁时，其余未得到锁的线程只能不停的尝试获得锁，而不能中断。这种情况对于大量的竞争线程会造成性能的下降等后果。</li>
<li>JDK5以后提供了ReentrantLock的同步机制对于前面提的两种情况有相对的改善。                   </li>
</ul>
<h4 id="3-2-锁的世界观"><a href="#3-2-锁的世界观" class="headerlink" title="3.2 锁的世界观"></a>3.2 锁的世界观</h4><h5 id="3-2-1-互斥和可见。volatile关键字de-作用。"><a href="#3-2-1-互斥和可见。volatile关键字de-作用。" class="headerlink" title="3.2.1 互斥和可见。volatile关键字de 作用。"></a>3.2.1 互斥和可见。volatile关键字de 作用。</h5><ul>
<li><p>问题1【写】</p>
<p>互斥保证了同时只有一个线程持有对象锁进行共享数据的操作，从而保证了数据操作的原子性</p>
</li>
<li><p>问题2【读】</p>
<p>而可见则保证共享数据的修改在下一个线程获得锁后看到更新后的数据。</p>
</li>
<li><p>Synchronized：保证可见性和原子性</p>
</li>
<li>Volatile：保证可见性，但不保证操作的原子性.volatile本质是在告诉JVM当前变量在寄存器中的值是不确定的，使用前，需要先从主存中读取，因此可以实现可见性。</li>
<li>Volatile不需要加锁，比Synchronized更轻量级，并不会阻塞线程</li>
<li>使用：在写的时候用synchronized，而读的时候就可以用volatile定义变量并使用就可以。<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">  public class AnotherSyncSample &#123;  </span><br><span class="line">	private volatile int counter;  											  </span><br><span class="line">	public int getCounter() &#123;   </span><br><span class="line">	return counter;   </span><br><span class="line">	&#125; 					  </span><br><span class="line">	public synchronized void add() &#123;  </span><br><span class="line">	counter++;  </span><br><span class="line">	&#125;  </span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>
</li>
</ul>
<h5 id="3-2-2-Java开发过程涉及了很多锁，本篇对这些锁的概念进行了整理。"><a href="#3-2-2-Java开发过程涉及了很多锁，本篇对这些锁的概念进行了整理。" class="headerlink" title="3.2.2 Java开发过程涉及了很多锁，本篇对这些锁的概念进行了整理。"></a>3.2.2 Java开发过程涉及了很多锁，本篇对这些锁的概念进行了整理。</h5><h5 id="公平锁和非公平锁"><a href="#公平锁和非公平锁" class="headerlink" title="公平锁和非公平锁"></a>公平锁和非公平锁</h5><h6 id="公平锁："><a href="#公平锁：" class="headerlink" title="公平锁："></a>公平锁：</h6><p>多个线程申请获取同一个锁，按照线程的申请顺序，排队获取锁。公平锁的好处是等待的线程不会被饿死，相应的缺陷就是整体吞吐量很低、效率很低。使用new ReentrantLock(true)可以构造一个公平锁。</p>
<h6 id="非公平锁："><a href="#非公平锁：" class="headerlink" title="非公平锁："></a>非公平锁：</h6><p>多个线程申请获取同一个锁，获取锁的顺序不按照申请顺序，抢占式的获取。非公平锁的好处是整体效率很高，但是可能会使有些线程一致在等待，造成饿死。使用Synchronized、new ReentrantLock()和new ReentrantLock(false)可以构建一个非公平锁。</p>
<h5 id="共享锁和独占锁"><a href="#共享锁和独占锁" class="headerlink" title="共享锁和独占锁"></a>共享锁和独占锁</h5><h6 id="共享锁："><a href="#共享锁：" class="headerlink" title="共享锁："></a>共享锁：</h6><p>简单的理解就是锁可以被多个线程持有。在实际使用过程中，线程A获取到了共享资源D的共享锁，其它线程只能获取D的共享锁，不能获取独占锁。</p>
<h6 id="独占锁："><a href="#独占锁：" class="headerlink" title="独占锁："></a>独占锁：</h6><p>一次只能有一个线程获得锁，即只能被一个线程持有。在实际使用过程中，线程A获取到了共享资源D的独占锁，其它线程不能获取D的任何类型锁。</p>
<h6 id="读写锁"><a href="#读写锁" class="headerlink" title="读写锁"></a>读写锁</h6><p>读写锁一次只有一个线程（writer线程）可以修改共享数据，但在许多情况下，任何数量的线程可以同时读取共享数据（reader线程）。Java中的读写锁通过ReentrantReadWriteLock实现。ReentrantReadWriteLock.ReadLock是读锁，它是共享锁。ReentrantReadWriteLock.WriteLock是写锁，它是独占锁。</p>
<h6 id="互斥锁"><a href="#互斥锁" class="headerlink" title="互斥锁"></a>互斥锁</h6><p>互斥锁即一次只能有一个线程持有的锁。ReentrantLock和synchronized都是互斥锁。</p>
<h6 id="悲观锁和乐观锁"><a href="#悲观锁和乐观锁" class="headerlink" title="悲观锁和乐观锁"></a>悲观锁和乐观锁</h6><p>悲观锁认为对同一数据的并发操作一定会出现冲突问题，所以，在对数据操作之前一定要加锁。Java编码中悲观锁的实现有很多种，for update就是一种。</p>
<p>乐观锁认为对同一数据的并发操作不会出现冲突问题，数据操作不加锁，会在操作提交时检查数据的完整性。Java中常用的乐观锁方式有版本号、时间戳。</p>
<h6 id="可重入锁"><a href="#可重入锁" class="headerlink" title="可重入锁"></a>可重入锁</h6><p>可重入锁，也称为递归锁，即线程在获取到某方法的锁之后，如果在该方法内部调用其它方法，这个方法也需要获取锁，那么进入这个方法将自动获取锁，它可以在一定程度上避免死锁。</p>
<h5 id="3-2-3-Lock的特点"><a href="#3-2-3-Lock的特点" class="headerlink" title="3.2.3 Lock的特点"></a>3.2.3 Lock的特点</h5><ol>
<li><p>我想很多购买了《Java程序员面试宝典》之类图书的朋友一定对下面 这个面试题感到非常熟悉：<br>问：请对比synchronized与java.util.concurrent.locks.Lock 的异同。<br>答案：主要相同点：Lock能完成synchronized所实现的所有功能<br>  主要不同点：Lock有比synchronized更精确的线程语义和更好的性能。synchronized会自动释放 锁，而Lock一定要求程序员手工释放，并且必须在finally从句中释放。</p>
</li>
<li><p>synchronized块的确不错，但是他有一些功能性的限制：<br>（1）它无法中断一个正在等候获得锁的线程，也无法通过投票得到锁，如果不想等下去，也就没法得到锁。<br>（2）synchronized 块对于锁的获得和释放是在相同的堆栈帧中进行的。多数情况下，这没问题（而且与异常处理交互得很好），但是，确实存在一些更适合使用 非块结构锁定的情况。</p>
</li>
<li>简单来讲：公平锁使线程按照请求锁的顺序依次获得锁；而不公平锁则允许讨价还价，在这种情况下，线程有时可以比先请求锁的其他线程先得到锁。 </li>
</ol>
<h5 id="3-2-4-LOCK"><a href="#3-2-4-LOCK" class="headerlink" title="3.2.4 LOCK"></a>3.2.4 LOCK</h5><ul>
<li>理解：JAVA中的锁主要包括synchronized, ReentrantLock, ReentrantReadWriteLock。</li>
<li>synchronized的特点是自动释放锁，作用在方法时自动获取锁，任意对象都可做为锁。</li>
<li>Lock弥补了synchronized的局限，提供了更加细粒度的加锁功能。</li>
<li><p>Lock的特点:必须自己创建锁,必须自己释放锁。—注意一定要在finally中释放锁，保证即便抛出异常也可以释放。</p>
   <figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">Lock l = ...; </span><br><span class="line">		l.lock();</span><br><span class="line">		try &#123;</span><br><span class="line">		// 执行代码</span><br><span class="line">		&#125; finally &#123;</span><br><span class="line">		l.unlock();</span><br><span class="line">		&#125;</span><br></pre></td></tr></table></figure>
</li>
<li><p>锁的基本概念：<br>(1)可重入锁。可重入锁是指同一个线程可以多次获取同一把锁。ReentrantLock和synchronized都是可重入锁。<br>(2)可中断锁。可中断锁是指线程尝试获取锁的过程中，是否可以响应中断。synchronized是不可中断锁，而ReentrantLock则提供了中断功能。<br>(3)公平锁与非公平锁。公平锁是指多个线程同时尝试获取同一把锁时，获取锁的顺序按照线程达到的顺序，而非公平锁则允许线程“插队”。<br>（4）synchronized是非公平锁，而ReentrantLock的默认实现是非公平锁，但是也可以设置为公平锁。</p>
</li>
</ul>
<h5 id="3-2-5-锁的世界观：协作"><a href="#3-2-5-锁的世界观：协作" class="headerlink" title="3.2.5 锁的世界观：协作"></a>3.2.5 锁的世界观：协作</h5><p>Java监视器支持两种线程：互斥和协作。</p>
<p>举个例子：有一家汉堡店举办吃汉堡比赛，决赛时有3个顾客来吃，3个厨师来做，一个服务员负责协调汉堡的数量。为了避免浪费，制作好的汉堡被放进一个能装有10个汉堡的长条状容器中，按照先进先出的原则取汉堡。如果容器被装满，则厨师停止做汉堡，如果顾客发现容器内的汉堡吃完了，就可以拍响容器上的闹铃，提醒厨师再做几个汉堡出来。此时服务员过来安抚顾客，让他等待。而一旦厨师的汉堡做出来，就会让服务员通知顾客，汉堡做好了，让顾客继续过来取汉堡。                                                            </p>
<p>这里，顾客其实就是我们所说的消费者，而厨师就是生产者。容器是决定厨师行为的监视器，而服务员则负责监视顾客的行为。</p>
<h5 id="3-2-6-线程池的世界观："><a href="#3-2-6-线程池的世界观：" class="headerlink" title="3.2.6 线程池的世界观："></a>3.2.6 线程池的世界观：</h5><p>线程池的使用：<br>   避免频繁创建线程，所以使用线程池。线程可以复用，就是执行完一个任务，并不被销毁，而是可以继续执行其他的任务。<br>   核心类：java.uitl.concurrent.ThreadPoolExecutor类是线程池中最核心的一个类。<br>   可构建不同类型的线程池：1.newFixedThreadPool创建一个固定长度的线程池。每当提交一个任务时就创建一个线程，直到达到线程池的数量，这时线程池的大小将不会变化。<br>                          2.newCachedThreadPool创建一个可缓存的线程池。如果线程池的当前数量超过了线程池，那么线程池将回收空闲的线程，如果任务很多的时候，它将会继续创建线程而不会存在任何的限制。<br>                          3.newSingleThreadExector创建一个线程来执行任务。采用单线程的机制，如果这个线程异常结束，那么会再重新创建一个线程，它始终保证在线程池里的只有一个线程，这样就可以保证任务在队列总是按照预定的顺序执行。<br>                          4.newScheduledThreadPoolnewScheduledThreadPool创建一个固定长度的线程池，而且是以延迟或者定时的方式来执行任务，这点有点类似于Timer类。</p>
<p>线程-基本属性：</p>
<p><code>`</code> </p>
<pre><code>###name：线程名称，可以重复，若没有指定会自动生成。 
###id：线程ID，一个正long值，创建线程时指定，终生不变，线程终结时ID可以复用。
###priority：线程优先级，取值为1到10，线程优先级越高，执行的可能越大，若运行环境不支持优先级分10级，如只支持5级，那么设置5和设置6有可能是一样的。
          MIN_PRIORITY： 1，最低优先级
          NORM_PRIORITY：5，普通优先级
          MAX_PRIORITY：10，最高优先级                 
###state：线程状态，Thread.State枚举类型，有 NEW，
                                         RUNNABLE，
                                         BLOCKED，
                                         WAITING，
                                         TIMED_WAITING，
                                         TERMINATED 5种。
###ThreadGroup：所属线程组，一个线程必然有所属线程组。
###UncaughtExceptionHandler：未捕获异常时的处理器，默认没有，线程出现错误后会立即终止当前线程运行，并打印错误。                                          
线程-构造方法：
Thread(ThreadGroup group, Runnable target, String name, long stackSize) 
###group：指定当前线程的线程组，未指定时线程组为创建该线程所属的线程组。
###target：指定运行其中的Runnable，一般都需要指定，不指定的线程没有意义，或者可以通过创建Thread的子类并重新run方法。
###name：线程的名称，不指定自动生成。
###stackSize：预期堆栈大小，不指定默认为0，0代表忽略这个属性。与平台相关，不建议使用该属性。     
</code></pre><p><code>`</code>    ——————————————————————————–</p>

          
        
      
    </div>
    
    
    

    

    

    

    <footer class="post-footer">
      

      

      

      
      
        <div class="post-eof"></div>
      
    </footer>
  </div>
  
  
  
  </article>


    
      

  

  
  
  

  <article class="post post-type-normal" itemscope itemtype="http://schema.org/Article">
  
  
  
  <div class="post-block">
    <link itemprop="mainEntityOfPage" href="http://lidongaiwangbaoxia.gitee.io/lideboke/lideboke/2019/03/24/hello-world/">

    <span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
      <meta itemprop="name" content="lid">
      <meta itemprop="description" content>
      <meta itemprop="image" content="/lideboke/uploads/liangzhicai.jpg">
    </span>

    <span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
      <meta itemprop="name" content="Hexo">
    </span>

    
      <header class="post-header">

        
        
          <h1 class="post-title" itemprop="name headline">
                
                <a class="post-title-link" href="/lideboke/2019/03/24/hello-world/" itemprop="url">Hello World</a></h1>
        

        <div class="post-meta">
          <span class="post-time">
            
              <span class="post-meta-item-icon">
                <i class="fa fa-calendar-o"></i>
              </span>
              
                <span class="post-meta-item-text">发表于</span>
              
              <time title="创建于" itemprop="dateCreated datePublished" datetime="2019-03-24T09:41:43+08:00">
                2019-03-24
              </time>
            

            

            
          </span>

          

          
            
          

          
          

          

          

          

        </div>
      </header>
    

    
    
    
    <div class="post-body" itemprop="articleBody">

      
      

      
        
          
            <p>Welcome to <a href="https://hexo.io/" target="_blank" rel="noopener">Hexo</a>! This is your very first post. Check <a href="https://hexo.io/docs/" target="_blank" rel="noopener">documentation</a> for more info. If you get any problems when using Hexo, you can find the answer in <a href="https://hexo.io/docs/troubleshooting.html" target="_blank" rel="noopener">troubleshooting</a> or you can ask me on <a href="https://github.com/hexojs/hexo/issues" target="_blank" rel="noopener">GitHub</a>.</p>
<h2 id="Quick-Start"><a href="#Quick-Start" class="headerlink" title="Quick Start"></a>Quick Start</h2><h3 id="Create-a-new-post"><a href="#Create-a-new-post" class="headerlink" title="Create a new post"></a>Create a new post</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ hexo new <span class="string">"My New Post"</span></span><br></pre></td></tr></table></figure>
<p>More info: <a href="https://hexo.io/docs/writing.html" target="_blank" rel="noopener">Writing</a></p>
<h3 id="Run-server"><a href="#Run-server" class="headerlink" title="Run server"></a>Run server</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ hexo server</span><br></pre></td></tr></table></figure>
<p>More info: <a href="https://hexo.io/docs/server.html" target="_blank" rel="noopener">Server</a></p>
<h3 id="Generate-static-files"><a href="#Generate-static-files" class="headerlink" title="Generate static files"></a>Generate static files</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ hexo generate</span><br></pre></td></tr></table></figure>
<p>More info: <a href="https://hexo.io/docs/generating.html" target="_blank" rel="noopener">Generating</a></p>
<h3 id="Deploy-to-remote-sites"><a href="#Deploy-to-remote-sites" class="headerlink" title="Deploy to remote sites"></a>Deploy to remote sites</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ hexo deploy</span><br></pre></td></tr></table></figure>
<p>More info: <a href="https://hexo.io/docs/deployment.html" target="_blank" rel="noopener">Deployment</a></p>

          
        
      
    </div>
    
    
    

    

    

    

    <footer class="post-footer">
      

      

      

      
      
        <div class="post-eof"></div>
      
    </footer>
  </div>
  
  
  
  </article>


    
  </section>

  


          </div>
          


          

        </div>
        
          
  
  <div class="sidebar-toggle">
    <div class="sidebar-toggle-line-wrap">
      <span class="sidebar-toggle-line sidebar-toggle-line-first"></span>
      <span class="sidebar-toggle-line sidebar-toggle-line-middle"></span>
      <span class="sidebar-toggle-line sidebar-toggle-line-last"></span>
    </div>
  </div>

  <aside id="sidebar" class="sidebar">
    
    <div class="sidebar-inner">

      

      

      <section class="site-overview-wrap sidebar-panel sidebar-panel-active">
        <div class="site-overview">
          <div class="site-author motion-element" itemprop="author" itemscope itemtype="http://schema.org/Person">
            
              <img class="site-author-image" itemprop="image" src="/lideboke/uploads/liangzhicai.jpg" alt="lid">
            
              <p class="site-author-name" itemprop="name">lid</p>
              <p class="site-description motion-element" itemprop="description"></p>
          </div>

          <nav class="site-state motion-element">

            
              <div class="site-state-item site-state-posts">
              
                <a href="/lideboke/archives/">
              
                  <span class="site-state-item-count">3</span>
                  <span class="site-state-item-name">日志</span>
                </a>
              </div>
            

            
              
              
              <div class="site-state-item site-state-categories">
                
                  <span class="site-state-item-count">2</span>
                  <span class="site-state-item-name">分类</span>
                
              </div>
            

            
              
              
              <div class="site-state-item site-state-tags">
                
                  <span class="site-state-item-count">2</span>
                  <span class="site-state-item-name">标签</span>
                
              </div>
            

          </nav>

          

          

          
          

          
          

          

        </div>
      </section>

      

      

    </div>
  </aside>


        
      </div>
    </main>

    <footer id="footer" class="footer">
      <div class="footer-inner">
        <div class="copyright">&copy; <span itemprop="copyrightYear">2019</span>
  <span class="with-love">
    <i class="fa fa-user"></i>
  </span>
  <span class="author" itemprop="copyrightHolder">lid</span>

  
</div>


  <div class="powered-by">由 <a class="theme-link" target="_blank" href="https://hexo.io">Hexo</a> 强力驱动</div>



  <span class="post-meta-divider">|</span>



  <div class="theme-info">主题 &mdash; <a class="theme-link" target="_blank" href="https://github.com/iissnan/hexo-theme-next">NexT.Pisces</a> v5.1.4</div>




        







        
      </div>
    </footer>

    
      <div class="back-to-top">
        <i class="fa fa-arrow-up"></i>
        
      </div>
    

    

  </div>

  

<script type="text/javascript">
  if (Object.prototype.toString.call(window.Promise) !== '[object Function]') {
    window.Promise = null;
  }
</script>









  












  
  
    <script type="text/javascript" src="/lideboke/lib/jquery/index.js?v=2.1.3"></script>
  

  
  
    <script type="text/javascript" src="/lideboke/lib/fastclick/lib/fastclick.min.js?v=1.0.6"></script>
  

  
  
    <script type="text/javascript" src="/lideboke/lib/jquery_lazyload/jquery.lazyload.js?v=1.9.7"></script>
  

  
  
    <script type="text/javascript" src="/lideboke/lib/velocity/velocity.min.js?v=1.2.1"></script>
  

  
  
    <script type="text/javascript" src="/lideboke/lib/velocity/velocity.ui.min.js?v=1.2.1"></script>
  

  
  
    <script type="text/javascript" src="/lideboke/lib/fancybox/source/jquery.fancybox.pack.js?v=2.1.5"></script>
  


  


  <script type="text/javascript" src="/lideboke/js/src/utils.js?v=5.1.4"></script>

  <script type="text/javascript" src="/lideboke/js/src/motion.js?v=5.1.4"></script>



  
  


  <script type="text/javascript" src="/lideboke/js/src/affix.js?v=5.1.4"></script>

  <script type="text/javascript" src="/lideboke/js/src/schemes/pisces.js?v=5.1.4"></script>



  

  


  <script type="text/javascript" src="/lideboke/js/src/bootstrap.js?v=5.1.4"></script>



  


  




	





  





  












  





  

  

  

  
  

  

  

  

</body>
</html>
